      <h1 class="entry-title entry-title-single" itemprop="headline">T-SQL 编程之临时表（TempTable）</h1>

    <div class="entry-content entry-content-single entry-content-aside" itemprop="text">
      <p>数据库(SQL)临时表就是符号 (#) 开头的表。如果当用户断开连接时没有除去临时表，SQL Server 将自动除去临时表。</p>
<p>临时表不存储在当前数据库内，而是存储在系统数据库 Tempdb 内。</p>
<p><span id="more-599"></span></p>
<p>&nbsp;</p>
<h3>1.本地临时表 </h3>
<p>以单个符号 (<b>#</b>) 开头的表名，只有在创建本地临时表的连接上才能看到这些表；</p>
<p>实例链接断开时临时表即被删除（本地临时表为创建它的该链接的会话所独享），或者这样说局部临时表是由当前用户创建的，并且只有当前用户的会话才可以访问。</p>
<p>如果本地临时表由存储过程创建或由多个用户同时执行的应用程序创建（其实可看作是不同的链接，不同的会话），则数据库引擎必须能够区分由不同用户创建的表。</p>
<p>为此，数据库引擎在内部为每个本地临时表的表名追加一个数字后缀，存储在 tempdb 的 sysobjects 表中的临时表，其全名由 CREATE TABLE 语句中指定的表名和系统生成的数字后缀组成。</p>
<p>为了允许追加后缀，为本地临时表指定的 table_name 不能超过 116 个字符。</p>
<p>&nbsp;</p>
<h3>2.全局临时表</h3>
<p>以两个井号 (<b>##</b>) 开头的那些表名。</p>
<p>在所有连接上都能看到全局临时表或者这样说只要这个全局临时表存在，那么用户创建会话后对所有的用户都是可见的。</p>
<p>如果在创建全局临时表的连接断开前没有显式地除去这些表，那么只要所有其它任务停止引用它们，这些表即被除去。</p>
<p>当创建全局临时表的连接断开后，新的任务不能再引用它们（换句话说旧的任务还何以引用）。</p>
<p>当前的语句一执行完，任务与表之间的关联即被除去；因此通常情况下，只要创建全局临时表的连接断开，全局临时表即被除去。</p>
<pre class="brush: sql;">
--- 失败的----
declare @sql varchar(100)

set @sql = 'select id as a,name as b into #b from shopName'
print @sql
exec(@sql)

select * from #b
drop table #b

-- 消息 208，级别 16，状态 0，第 5 行
-- 对象名  '#b' 无效。


--- 成功的-----
declare @sql varchar(100)

set @sql = 'select id as a,name as b into ##b from shopName'
print @sql
exec(@sql)

select * from ##b
drop table ##b  -- 一定要DROP不然又要报错
</pre>
<p>&nbsp;</p>
<h3>3.创建临时表</h3>
<p>通过 CREATE TABLE 语句创建临时表：</p>
<pre class="brush: sql;">
CREATE TABLE #Temp_TABLE
( 
  ID int identity(1,1),
  TRANSID nvarchar(30),  -- 出库单号
  Primary Key (ID)
)
</pre>
<p>&nbsp;</p>
<p>可以通过查询语句为内表赋值：</p>
<p>1) 查询单个数据表时：</p>
<pre class="brush: sql;">
Select Transid Into #Temp_TABLE From A
</pre>
<p>&nbsp;</p>
<p>2) 查询两个或两个以上表时：</p>
<pre class="brush: sql;">

-- 填充数据至临时表(#Temp_TABLE)
Select Transid Into #Temp_TABLE
    From A Inner Join B On A.id = B.id

</pre>
<p>&nbsp;</p>
<p>3) 将临时表数据插入到额外的数据表中：</p>
<pre class="brush: sql;">

-- 通过临时表获取数据
Insert Into dbTable
      Select Transid From #Temp_TABLE

</pre>
<p>&nbsp;</p>
<h3>4.删除临时表</h3>
<p>通过Drop Table 删除临时表；</p>
<pre class="brush: sql;">
   Drop Table #Temp_table
</pre>
<p>&nbsp;</p>
<p>为确保数据正确性，在删除临时表前，通过 <b style="color:red;">OBJECT_ID</b> <span class='wp_keywordlink'><a href="http://www.sapjx.com/tag/function" title="函数" target="_blank">函数</a></span>检查是否在 <b>Tempdb</b> 中存在该临时表。</p>
<p>语法：<br />
<b style="color:red;"><br />
OBJECT_ID ( &#8216;[ database_name . [ schema_name ] . | schema_name . object_name&#8217; [ ,'object_type' ] )<br />
</b></p>
<p>&nbsp;</p>
<p>示例：</p>
<pre class="brush: sql;">
if not object_id('TempDB..#Temp_table') is null
begin
     DROP TABLE TempDB..#Temp_table
end
</pre>
<p>&nbsp;</p>
<p>给出一个完整示例：</p>
<pre class="brush: sql;">

declare @ss   nvarchar(4000)  -- SQL 语句
declare @TRnd nvarchar(4)     -- 随机数

Set @TRnd = 'YF09'

-- 使用前，判断临时表是否已存在，存在则删除 ------

-- 临时表A
Set @ss = 'TempDB..G' + @TRnd + 'A'

IF not object_id(@ss) is null
begin
Set @ss = 'DROP TABLE TempDB..G' + @TRnd + 'A'
exec (@ss)
end

Set @ss = 'select ccode into TempDB..G' + @TRnd + 'A from code'
exec (@ss)

-- 临时表C
set @ss = 'TempDB..G' + @TRnd + 'C'

if not object_id(@ss) is null
begin
set @ss = 'DROP TABLE TempDB..G' + @TRnd + 'C'
exec (@ss)
end

-- 临时表B
set @ss = 'TempDB..G' + @TRnd + 'B'

if not object_id(@ss) is null
begin
set @ss = 'DROP TABLE TempDB..G'+ @TRnd +'B'
exec (@ss)
end

set @ss = 'select distinct code.ccode into TempDB..G' + @TRnd + 'B from code 
           inner join TempDB..G' + @TRnd + 'A 
           on code.ccode like ( TempDB..G' + @TRnd + 'A.ccode+ ''%'') 
           where code.bend = 1'
exec (@ss)


-- 最后，删除内表
set @ss = 'TempDB..G' + @TRnd + 'A'
if not object_id(@ss) is null

begin
set @ss = 'DROP TABLE TempDB..G' + @TRnd + 'A'
exec (@ss)
end


set @ss = 'TempDB..G' + @TRnd + 'B'
if not object_id(@ss) is null
begin
set @ss = 'DROP TABLE TempDB..G' + @TRnd + 'B'
exec (@ss)
end


set @ss = 'TempDB..G' + @TRnd + 'C'
if not object_id(@ss) is null
begin
set @ss = 'DROP TABLE TempDB..G' + @TRnd + 'C'
exec (@ss)
end

</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>参考文章：</p>
<p><a href="http://www.cnblogs.com/Fskjb/archive/2009/07/06/1517989.html" target="_blank">http://www.cnblogs.com/Fskjb/archive/2009/07/06/1517989.html</a></p>
<p><a href="http://blog.sina.com.cn/s/blog_7fff68b90101dcnp.html" target="_blank">http://blog.sina.com.cn/s/blog_7fff68b90101dcnp.html</a><br />
&nbsp;</p>